#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

void print(int num)
{
	cout << "应用普通函数指针，调用了一个带有1个int类型的参数，并且返回类型是void的函数，int值为" << num << endl;
}

class Student{
public:
	string name;
	int age;
	
	Student(string name, int age)
	{
		this->name = name;
		this->age = age;
	}
	
	Student(){
	}
	
	void show(){
		cout << "name = " << name << endl;
		cout << "age = " << age << endl;
	}
	
};

int main(int argc, char *argv[]) {
	/*
		1、指向普通函数的 指针
		数据类型名 (* 指针变量名)（参数列表）；
	*/
	// 指向的函数是带有1个int类型的参数，并且返回类型是void
	void (*point) (int);
	point = print; // print表示print()函数的地址
	(*point)(34);  // 调用
	
	/*
		2、指向成员函数的指针
		数据类型名（类名::*指针变量名）（参数列表);
	*/
	//error: void(*point2)(int) = &Student::show;	
	//类将函数封装，类外无法直接访问，创建void (Student::*point2) (int) 类型指针，指向类内成员函数
	
	void (Student::*point2)();//point2指向Student的成员函数，该成员函数返回值为void，无参数
	Student stu1("zhangsan",23);
	Student stu2("lisi",24);
	Student* stu3 = new Student("zhaoliu", 26);
	
	//指向具体的成员函数 -- 指针变量名 = &类名::成员函数名；
	//error: point2 = &stu1::show; -- error: 指针变量名 = &对象名::成员函数名；
	point2 = &Student::show;
	
	//调用，具体对象，具体分析 -- （对象名.*函数指针名）();
	(stu1.*point2)();
	(stu2.*point2)();
	(stu3->*point2)();

}